
#ifndef	_ARH_TIPKOVNICA_H_
#define	_ARH_TIPKOVNICA_H_

#include "tipovi.h"

//! sucelje prema jezgri

//Tipka: 31------16 15--8 7---0
//       |||||||||| ||||| ^^^^^ - ASCII oznaka znaka
//       |||||||||| ^^^^^ - kod specijalne tipke, stisnute ili otpustene
//       ^^^^^^^^^^ - stisnute tipke (drze se, npr. drzi se SHIFT a stislo se A)

//zastavice specijalnih tipki (tako se citaju iz medjusklopoa tipkovnice)
#define LSHIFT	(0x01 << 16)
#define DSHIFT	(0x02 << 16)
#define LALT	(0x04 << 16)
#define DALT	(0x08 << 16)
#define LCTRL	(0x10 << 16)
#define	DCTRL	(0x20 << 16)
#define CAPSL	(0x40 << 16)

//kodovi posebnih tipki (moji kodovi da ih raspoznajem, ne od tipkovnice!)
enum {
	TLSHIFT = 1,	//uz <<8 postaje 0x0000 0100
	TDSHIFT,
	TLALT,
	TDALT,
	TLCTRL,
	TDCTRL,
	TCAPSL,
	TTAB,
	TBACKSP,
	TRETURN,
	TGORE,
	TDOLE,
	TLIJEVO,
	TDESNO,
	TESC,
	TF1,
	TF2,
	TF3,
	TF4,
	//itd.
	
	BROJ_TIPKI
};
#define STIPKA(X) ((X) << 8)

#define ZNAK	1
#define RIJEC	2
#define REDAK	4

typedef struct _zt_ {
	int sto; //ZNAK, RIJEC, RED
	int *ms; //kazaljka na MS za stavit znakove
	int ms_d; //duljina MS-a
	bool svaki; //ako citam znak mogu dobiti i kontrolne
	bool cekaj; //treba blokirati dretvu ako nema nista?
} zahtjev_tipkovnici;


void arh_dozvoli_prekid_tipkovnice ();
void arh_zabrani_prekid_tipkovnice ();
void arh_tipkovnica_inicijaliziraj (bool prikazi_stisnuto);
int arh_tipkovnica_dohvati (zahtjev_tipkovnici *p);
bool arh_tipkovnica_obradi_prekid();

#ifdef _ARH_TIPKOVNICA_C_ // sakrivam od ostalih (pod)sustava

#define tipkovnica_PR	0x60	//! podatkovni registar
#define tipkovnica_SR	0x64	//! statusni registar

#define	TIPKA_MS_VEL	256 //ucitani znakovi

#define INC_MOD(x)			\
	(x)++;				\
	if ((x) >= (TIPKA_MS_VEL))	\
		(x) = 0;

typedef int tipka_t;

#define	CAPSLED	0x02 //4?

#define ZNAK_MASKA	0x00ff

//! interne ("arh/tipkovnica") funkcije
static void tipkovnica_postavi_ledice();
static void tipkovnica_naredba(int nar);
static tipka_t tipkovnica_obradi (int c);
static tipka_t arh_tipkovnica_procitaj ();

#endif // _ARH_TIPKOVNICA_C_
#endif	/* _ARH_TIPKOVNICA_H_ */
